package com.cskaoyan.wordmemorize.controller.app;

import com.cskaoyan.wordmemorize.auth.StpKit;
import com.cskaoyan.wordmemorize.common.result.Result;
import com.cskaoyan.wordmemorize.dto.admin.PageDTO;
import com.cskaoyan.wordmemorize.dto.app.UserCheckinDTO;
import com.cskaoyan.wordmemorize.dto.app.UserCheckinStatisticsDTO;
import com.cskaoyan.wordmemorize.request.PageRequest;
import com.cskaoyan.wordmemorize.request.UserCheckinCommand;
import com.cskaoyan.wordmemorize.service.UserCheckinService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import org.springframework.web.bind.annotation.*;

/**
 * 用户打卡相关接口
 */
@Tag(name = "移动端-用户打卡模块")
@RestController
@RequestMapping("/user/checkin")
public class AppUserCheckinController {

    @Resource
    private UserCheckinService userCheckinService;

    /**
     * 同步用户打卡数据
     *
     * @param command 打卡信息请求体
     * @return UserCheckinStatisticsDTO 打卡统计数据
     */
    @Operation(summary = "同步用户打卡数据", description = "主要用户用客户端点击打卡")
    @PostMapping
    public Result<UserCheckinStatisticsDTO> checkin(@RequestBody UserCheckinCommand command) {
        // 获取当前登录用户的ID
        Long userId = StpKit.USER.getLoginIdAsLong();

        // command里的userId是String类型的，需要转换
        command.setUserId(String.valueOf(userId));

        // 调用Service层方法
        UserCheckinStatisticsDTO statisticsDTO = userCheckinService.checkin(command);

        // 返回UserCheckinStatisticsDTO 打卡统计数据
        return Result.ok(statisticsDTO);
    }

    /**
     * 获取用户的打卡统计数据
     *
     * @return UserCheckinStatisticsDTO 打卡统计数据
     */
    @Operation(summary = "获取用户的打卡统计数据", description = "主要用于app中我的页面的数据展示")
    @GetMapping("/statistics")
    public Result<UserCheckinStatisticsDTO> getUserCheckinStatistics() {
        // 获取当前登录用户的ID
        Long userId = StpKit.USER.getLoginIdAsLong();

        // 调用Service层方法
        UserCheckinStatisticsDTO statisticsDTO = userCheckinService.getUserCheckinStatistics(userId);

        // 返回UserCheckinStatisticsDTO 打卡统计数据
        return Result.ok(statisticsDTO);
    }

    /**
     * 下载用户的所有打卡数据（分页）
     *
     * @param pageRequest 分页查询请求体
     * @return PageDTO<UserCheckinDTO> 打卡数据分页结果
     */
    @Operation(summary = "下载用户的所有打卡数据", description = "主要用于用户每次登录时下载用户数据")
    @GetMapping("/list")
    public Result<PageDTO<UserCheckinDTO>> getCheckInData(PageRequest pageRequest) {
        // 获取当前登录用户的ID
        Long userId = StpKit.USER.getLoginIdAsLong();

        // 调用Service层方法
        PageDTO<UserCheckinDTO> pageDTO = userCheckinService.getCheckInData(pageRequest, userId);

        // 返回UserCheckinDTO 打卡数据 分页结果
        return Result.ok(pageDTO);
    }

    /**
     * 使用补签卡
     */
    @Operation(summary = "使用补签卡", description = "用户在签到日历旁点击使用补签卡")
    @PostMapping("/card")
    public Result<Void> userResignCard() {
        // 获取当前登录用户的ID
        Long userId = StpKit.USER.getLoginIdAsLong();

        // 调用Service层方法
        userCheckinService.userResignCard(userId);

        return Result.ok();
    }
}
